%function Geometry2D_Rib(MyGeometry) UseProtectionOxideCover=false; UseSub=false; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %{ lambda=0.75; tCore=0.215; %um tClad=2; %um etchDepth=0.3; %um wireWidth=1; xCore=0.3;nCore=nAlGaAs(xCore,lambda); xClad=0.5;nClad=nAlGaAs(xClad,lambda); nSub=nAlGaAs(0,lambda); WindowEdge=3; % from edge of rib to boundary of calculation window %} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % { lambda=1.55; tCore=0.17; %um tClad=2; %um etchDepth=0.17; %um wireWidth=1.5; jMaterial=0; DecreaseMesh=5; % 2 means 2 times %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% jMaterial=jMaterial+1;jAir=jMaterial; MyMaterial(jAir).name=[MyName00 'Air']; nAir=1; MyMaterial(jAir).n=nAir; MyMaterial(jAir).Mesh2Dmax=lambda/5/DecreaseMesh; % mesh for 2D calculations MyMaterial(jAir).Mesh2Dmin=lambda/10/DecreaseMesh; MyMaterial(jAir).Mesh3Dmax=lambda/5/DecreaseMesh; % mesh for 3D calculations plane MyMaterial(jAir).Mesh3Dmin=lambda/10/DecreaseMesh; if UseProtectionOxideCover jMaterial=jMaterial+1; MyMaterial(jMaterial).name=[MyName00 'oxideProtection']; nOxide=nSiO2(lambda); MyMaterial(jMaterial).n=nOxide; jOxide=jMaterial; ProtectionOxideThickness=0.05; %um MyMaterial(jMaterial).Mesh2Dmax=ProtectionOxideThickness/2/DecreaseMesh; % mesh for 2D calculations MyMaterial(jMaterial).Mesh2Dmin=ProtectionOxideThickness/3/DecreaseMesh; MyMaterial(jMaterial).Mesh3Dmax=ProtectionOxideThickness/2/DecreaseMesh; % mesh for 3D calculations plane MyMaterial(jMaterial).Mesh3Dmin=ProtectionOxideThickness/3/DecreaseMesh; end jMaterial=jMaterial+1;jCore=jMaterial; MyMaterial(jCore).name=[MyName00 'GaAs_core']; xCore=0;nCore=nAlGaAs(xCore,lambda); MyMaterial(jCore).n=nCore; MyMaterial(jCore).Mesh2Dmax=lambda/10/DecreaseMesh; % mesh for 2D calculations MyMaterial(jCore).Mesh2Dmin=lambda/15/DecreaseMesh; MyMaterial(jCore).Mesh3Dmax=lambda/10/DecreaseMesh; % mesh for 3D calculations plane MyMaterial(jCore).Mesh3Dmin=lambda/15/DecreaseMesh; jMaterial=jMaterial+1;jClad=jMaterial; MyMaterial(jClad).name=[MyName00 'AlGaAs_clad']; xClad=0.5;nClad=nAlGaAs(xClad,lambda); MyMaterial(jClad).n=nClad; MyMaterial(jClad).Mesh2Dmax=lambda/5/DecreaseMesh; % mesh for 2D calculations MyMaterial(jClad).Mesh2Dmin=lambda/10/DecreaseMesh; MyMaterial(jClad).Mesh3Dmax=lambda/5/DecreaseMesh; % mesh for 3D calculations plane MyMaterial(jClad).Mesh3Dmin=lambda/10/DecreaseMesh; if UseSub jMaterial=jMaterial+1; MyMaterial(jMaterial).name=[MyName00 'GaAs_substrate']; nSub=nAlGaAs(0,lambda); MyMaterial(jMaterial).n=nSub; jSub=jMaterial; MyMaterial(jMaterial).Mesh2Dmax=lambda/5/DecreaseMesh; % mesh for 2D calculations MyMaterial(jMaterial).Mesh2Dmin=lambda/10/DecreaseMesh; MyMaterial(jMaterial).Mesh3Dmax=lambda/5/DecreaseMesh; % mesh for 3D calculations plane MyMaterial(jMaterial).Mesh3Dmin=lambda/10/DecreaseMesh; end AirAbove=0.5; %um Air above WindowEdge=3; % from edge of rib to boundary of calculation window %} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Si waveguide %{ lambda=1.55; tCore=0.22; %um tClad=0.5; %um etchDepth=0.3; %um wireWidth=0.350; MyMaterial(1).name=[MyName00 'SiCore']; nCore=nSi(lambda); MyMaterial(1).n=nCore; MyMaterial(2).name=[MyName00 'SiO2Clad']; nClad=nSiO2(lambda); MyMaterial(2).n=nClad; MyMaterial(3).name=[MyName00 'Air']; nAir=1; MyMaterial(3).n=nAir; AirAbove=0.5; %um Air above jMaterial=3; if UseSub jMaterial=jMaterial+1; MyMaterial(jMaterial).name=[MyName00 'SiSubstrate']; nSub=nSi(lambda); MyMaterial(jMaterial).n=nSub; jSub=jMaterial; end WindowEdge=0.5; % from edge of rib to boundary of calculation window %} %CutLinePos=0.1; % um position where transverse refractive index is calculated SubThickness=1; EtchedRadius=0.05; OxideTopRadius=0.05; numberModeSearch=4; nAprox=(0.85*nCore+0.15*nClad); disp('2D geometry started') %%%%%%%%%%%%%% geometry lambda=0.75; % wavelength in um model.param.set('nAprox', num2str(nAprox),'aproximate of refractive index'); model.param.set('lambda', [num2str(lambda) '[um]'],'wavelength'); model.param.set('CoreThickness', [num2str(tCore) '[um]'],'thickness of Core'); model.param.set('CladThickness', [num2str(tClad) '[um]'],'thickness of clad'); model.param.set('SubThickness', [num2str(SubThickness) '[um]'],'thickness of sub (calculution window'); if UseProtectionOxideCover model.param.set('ProtectionOxideCover', [num2str(ProtectionOxideThickness) '[um]'],'thickness of protection oxide cover');end model.param.set('WireWidth',[num2str(wireWidth) '[um]'], 'width of main wire'); model.param.set('EtchingDepth',[num2str(etchDepth) '[um]'], 'should be larger than core'); model.param.set('CalculationWidth',['WireWidth+' num2str(WindowEdge) '[um]'], 'width of main wire'); model.param.set('AirAbove',[num2str(AirAbove) '[um]'], 'air abov'); % zero at boundary core and clad layers %air myAirName=[MyName00 'r8']; r8=MyGeometry.feature.create(myAirName, 'Rectangle'); r8.set('size',{'CalculationWidth' 'EtchingDepth+AirAbove'}); r8.set('pos',{'-CalculationWidth/2' 'CoreThickness-EtchingDepth'}); geom1.run; MyGeometry.feature().create( [MyName00 'sel1Air'], 'Selection'); MyGeometry.feature([MyName00 'sel1Air']).selection('selection').set(myAirName,1); MyMaterial(jAir).Object2Sel{1}=[MyName00 'sel1Air']; MyMaterial(jAir).Object2{1}=myAirName; if UseSub % GaAs sub MySubName=[MyName00 'r1']; r1=MyGeometry.feature.create(MySubName, 'Rectangle'); r1.set('size',{'CalculationWidth' 'SubThickness'}); r1.set('pos',{'-CalculationWidth/2' '-SubThickness-CladThickness'}); geom1.run MyGeometry.feature().create([MyName00 'sel1Sub'], 'Selection'); MyGeometry.feature([MyName00 'sel1Sub']).selection('selection').set(MySubName,1); MyMaterial(jSub).Object2Sel{1}=[MyName00 'sel1Sub']; MyMaterial(jSub).Object2{1}=MySubName; end % SiO2 if UseProtectionOxideCover r6=MyGeometry.feature.create([MyName00 'r6'], 'Rectangle'); r6.set('size',{'WireWidth+2*ProtectionOxideCover' 'EtchingDepth+ProtectionOxideCover'}); r6.set('pos',{'-WireWidth/2-ProtectionOxideCover' 'CoreThickness-EtchingDepth'}); geom1.run; MyGeometry.feature.create([MyName00 'fil6'], 'Fillet'); MyGeometry.feature([MyName00 'fil6']).selection('point').set([MyName00 'r6'], [3 4]); MyGeometry.feature([MyName00 'fil6']).set('radius', num2str(OxideTopRadius)); r7=MyGeometry.feature.create([MyName00 'r7'], 'Rectangle'); r7.set('size',{'CalculationWidth' 'ProtectionOxideCover'}); r7.set('pos',{'-CalculationWidth/2' 'CoreThickness-EtchingDepth'}); geom1.run; MyGeometry.feature.create([MyName00 'uni1'], 'Union'); MyGeometry.feature([MyName00 'uni1']).selection('input').set({[MyName00 'fil6'] [MyName00 'r7']}); MyGeometry.feature([MyName00 'uni1']).set('intbnd', 'off'); geom1.run; MyGeometry.feature().create([MyName00 'sel1SiO2'], 'Selection'); MyGeometry.feature([MyName00 'sel1SiO2']).selection('selection').set([MyName00 'uni1'],1); %MySiO2Name=[MyName00 'uni1']; MyMaterial(jOxide).Object2Sel{1}=[MyName00 'sel1SiO2']; MyMaterial(jOxide).Object2{1}=[MyName00 'uni1']; end % AlGaAs clad before etch r2=MyGeometry.feature.create([MyName00 'r2'], 'Rectangle'); r2.set('size',{'CalculationWidth' 'CladThickness'}); r2.set('pos',{'-CalculationWidth/2' '-CladThickness'}); % AlGaAs core before etch r3=MyGeometry.feature.create([MyName00 'r3'], 'Rectangle'); r3.set('size',{'CalculationWidth' 'CoreThickness'}); r3.set('pos',{'-CalculationWidth/2' '0'}); % %etching rib r4=MyGeometry.feature.create([MyName00 'r4'], 'Rectangle'); r4.set('size',{'WireWidth' 'EtchingDepth'}); r4.set('pos',{'-WireWidth/2' 'CoreThickness-EtchingDepth'}); %etching rib r5=MyGeometry.feature.create([MyName00 'r5'], 'Rectangle'); r5.set('size',{'CalculationWidth' 'EtchingDepth'}); r5.set('pos',{'-CalculationWidth/2' 'CoreThickness-EtchingDepth'}); geom1.run; % etched space MyGeometry.feature.create([MyName00 'dif1'], 'Difference'); MyGeometry.feature([MyName00 'dif1']).selection('input').set({[MyName00 'r5']}); MyGeometry.feature([MyName00 'dif1']).selection('input2').set({[MyName00 'r4']}); if tCore<=etchDepth; MyGeometry.feature([MyName00 'dif1']).set('keep', 'on');end geom1.run if tCore<=etchDepth % etched space MyGeometry.feature.create([MyName00 'dif1a'], 'Difference'); MyGeometry.feature([MyName00 'dif1a']).selection('input').set({[MyName00 'r5']}); MyGeometry.feature([MyName00 'dif1a']).selection('input2').set({[MyName00 'r4']}); geom1.run; end % etched with fille MyGeometry.feature.create([MyName00 'fil2'], 'Fillet'); MyGeometry.feature([MyName00 'fil2']).selection('point').set([MyName00 'dif1'], [3 5]); MyGeometry.feature([MyName00 'fil2']).set('radius', num2str(EtchedRadius)); % fil2 is what etched from gaas geom1.run; if tCore>etchDepth % AlGaAs core after etch MyGeometry.feature.create([MyName00 'dif2'], 'Difference'); MyGeometry.feature([MyName00 'dif2']).selection('input').set({[MyName00 'r3']}); %core MyGeometry.feature([MyName00 'dif2']).selection('input2').set({[MyName00 'fil2']}); geom1.run; MyGeometry.feature().create([MyName00 'sel1Core'], 'Selection'); MyGeometry.feature([MyName00 'sel1Core']).selection('selection').set([MyName00 'dif2'],1); MyGeometry.feature().create([MyName00 'sel1Clad'], 'Selection'); MyGeometry.feature([MyName00 'sel1Clad']).selection('selection').set([MyName00 'r2'],1); %MyCoreName=[MyName00 'dif2']; %MyCladNAme=[MyName00 'r2']; MyMaterial(jCore).Object2{1}=[MyName00 'dif2']; MyMaterial(jClad).Object2{1}=[MyName00 'r2']; else % AlGaAs clad after etch MyGeometry.feature.create([MyName00 'dif2'], 'Difference'); MyGeometry.feature([MyName00 'dif2']).selection('input').set({ [MyName00 'r2']}); %core MyGeometry.feature([MyName00 'dif2']).selection('input2').set({[MyName00 'fil2']}); % AlGaAs core after etch MyGeometry.feature.create([MyName00 'dif3'], 'Difference'); MyGeometry.feature([MyName00 'dif3']).selection('input').set({[MyName00 'r3']}); %clad MyGeometry.feature([MyName00 'dif3']).selection('input2').set({[MyName00 'dif1a']}); geom1.run; MyGeometry.feature().create([MyName00 'sel1Clad'], 'Selection'); MyGeometry.feature([MyName00 'sel1Clad']).selection('selection').set([MyName00 'dif2'],1); MyGeometry.feature().create([MyName00 'sel1Core'], 'Selection'); MyGeometry.feature([MyName00 'sel1Core']).selection('selection').set([MyName00 'dif3'],1); %MyCoreName=[MyName00 'dif3']; %MyCladNAme=[MyName00 'dif2']; MyMaterial(jCore).Object2{1}=[MyName00 'dif3'];; MyMaterial(jClad).Object2{1}=[MyName00 'dif2'];; end MyMaterial(jCore).Object2Sel{1}=[MyName00 'sel1Core']; MyMaterial(jClad).Object2Sel{1}=[MyName00 'sel1Clad']; %%%%%%%%%%%%%%%%%%%%% disp(' 2D waveguide geometry OK') %return %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%